﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpJournalInterface.h"
#include "WeakReferenceable.h"

namespace gcmp
{
    class IJournalUiObject;
    class IJournalUiEvent;

    /// \brief 日志事件接收者
    ///
    /// 日志录制时,用户可以处理日志事件
    /// 用户可以派生这个接口类，实现以下接口来定制Ui对象、事件的忽略录制行为
    class GCMP_JOURNAL_INTERFACE_EXPORT IJournalRecordEventReceiver :public WeakReferenceable
    {
    public:
        virtual ~IJournalRecordEventReceiver(void) {};

        /// \brief 判断日志是否需要忽略对象或事件
        ///
        /// 日志录制前会通过这个接口查询对象、事件是否需要录制
        /// \param[in] pIUiObject 控件
        /// \param[in] pIUiEvent 事件
        /// \return true忽略，fasle不忽略
        virtual bool ShouldIgnoreRecordQEvent(const IJournalUiObject *pIUiObject, const IJournalUiEvent *pIUiEvent) const = 0;

        /// \brief 判断日志是否需要忽略对象
        ///
        /// 日志录制前会通过这个接口查询对象是否需要录制
        /// \param[in] pIUiObject 控件
        /// \return true忽略，fasle不忽略
        virtual bool ShouldIgnoreRecordQWidget(const IJournalUiObject *pIUiObject) const = 0;

        /// \brief 判断日志是否需要忽略校验对象
        ///
        /// 对于没有被忽略的对象，需要判断这个对象日志目前是否支持录制，若不支持将报错，这就是校验
        /// 有些对象，虽然日志不支持录制，但也没有支持的必要，如标签，可以通过这个接口来忽略校验
        /// 日志录制前会通过这个接口查询对象是否需要校验
        /// \param[in] pIUiObject 控件
        /// \return true忽略，fasle不忽略
        virtual bool ShouldIgnoreVerifyQWidget(const IJournalUiObject *pIUiObject) const = 0;

        /// \brief 判断日志是否需要过滤事件，使其不会被触发；被过滤的事件不会被录制
        ///
        /// 日志录制前会通过这个接口查询对象、事件是否需要过滤
        /// \param[in] pIUiObject 控件
        /// \param[in] pIUiEvent 事件
        /// \return true过滤，fasle不过滤
        virtual bool ShouldFilterEvent(const IJournalUiObject *pIUiObject, const IJournalUiEvent *pIUiEvent) const = 0;
    };
}


